package com.tsing.cli.generator;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.ibatis.type.JdbcType;

/**
 * MyBatis-Plus 代码生成器
 *
 * @author TheTsing
 */
public class MpGenerator {

    /**
     * MySQL 主机地址
     */
    private static final String HOST = "localhost";

    /**
     * MySQL 端口号
     */
    private static final String PORT = "3306";

    /**
     * MySQL 数据库名
     */
    private static final String DATABASE = "cli";

    /**
     * MySQL 用户名
     */
    private static final String USERNAME = "cli";

    /**
     * MySQL 密码
     */
    private static final String PASSWORD = "cli";

    /**
     * MySQL url 地址，不用修改
     */
    private static final String URL = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE + "?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=true";

    /**
     * 模块名
     */
    private static final String MODEL_NAME = "cli-common";

    /**
     * 包名
     */
    private static final String PACKAGE_NAME = "com.tsing.cli.common";

    public static void main(String[] args) {
        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
                // 全局配置
                .globalConfig(builder -> {
                    builder.disableOpenDir() // 禁止打开输出目录
                            .outputDir(System.getProperty("user.dir") + "/" + MODEL_NAME + "/src/main/java") // 指定输出目录
                            .author("TheTsing") // 作者名
                            //.enableKotlin() // 开启 kotlin 模式
                            //.enableSwagger() // 开启 swagger 模式
                            //.enableSpringdoc() // 开启 springdoc 模式
                            //.disableServiceInterface() // 不生成 service 接口
                            .dateType(DateType.ONLY_DATE) // 时间策略
                            .commentDate("yyyy-MM-dd HH:mm:ss"); // 注释日期
                })
                // 数据库配置
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                    if (JdbcType.TINYINT == metaInfo.getJdbcType()) {
                        return DbColumnType.INTEGER;
                    }
                    return typeRegistry.getColumnType(metaInfo);
                }))
                //包配置
                .packageConfig(builder -> {
                    builder.parent(PACKAGE_NAME) // 父包名
                            .entity("entity") // Entity 包名
                            .service("service") // Service 包名
                            .serviceImpl("service.impl") // Service Impl 包名
                            .mapper("mapper") // Mapper 包名
                            .xml("mapper.xml") // Mapper XML 包名
                            .controller("controller"); // Controller 包名
                })
                //模板配置
                .templateEngine(new FreemarkerTemplateEngine())
                // 策略配置
                .strategyConfig(builder -> {
                    builder
                            //.enableCapitalMode() // 开启大写命名
                            //.enableSkipView() // 开启跳过视图
                            //.disableSqlFilter() // 禁用 sql 过滤
                            //.enableSchema() // 启用 schema
                            .addTablePrefix("sys_", "t_") // 增加过滤表前缀
                            //.addTableSuffix("sys_", "t_") // 增加过滤表后缀
                            //.addFieldPrefix() // 增加过滤字段前缀
                            //.addFieldSuffix() // 增加过滤字段后缀
                            //.addInclude("t_simple") // 增加包含的表名
                            //.addExclude("t_simple") // 增加排除表
                            .likeTable(new LikeTable("sys_")) // 包含表名
                            //.notLikeTable(new LikeTable("sys_")) // 不包含表名
                            // Entity 策略配置
                            .entityBuilder()
                            //.disableSerialVersionUID() // 禁用生成 serialVersionUID
                            //.enableColumnConstant() // 开启生成字段常量
                            .enableChainModel() // 开启链式模型
                            .enableLombok() // 开启 lombok 模型
                            .enableRemoveIsPrefix() // 开启 Boolean 类型字段移除 is 前缀
                            //.enableTableFieldAnnotation() // 开启生成实体时生成字段注解
                            //.enableActiveRecord() // 开启 ActiveRecord 模式
                            //.versionColumnName("version") // 设置乐观锁数据库表字段名称
                            .logicDeleteColumnName("is_deleted") // 逻辑删除数据库表字段名称
                            .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                            .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略
                            .idType(IdType.ASSIGN_ID) // 全局主键类型
                            .formatFileName("%sEntity") // 格式化文件名称
                            // Controller 策略配置
                            .controllerBuilder()
                            .enableRestStyle();
                })
                .execute();
    }

}
